package com.hypo.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.hypo.mapper.EmpExprMapper;
import com.hypo.mapper.EmpMapper;
import com.hypo.pojo.*;
import com.hypo.service.EmpLogService;
import com.hypo.service.EmpService;
import com.hypo.until.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;

    @Autowired
    private EmpLogService empLogService;

    /***
     * 分页查询
     */
    @Override
    public PageResult page(EmpQueryParam empQueryParam) {
        //1、分页设置
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());

        //3、执行查询
        List<Emp> list = empMapper.list(empQueryParam);
        Page<Emp> pageList = (Page<Emp>) list;

        //4、封装PageResult对象
        return new PageResult(pageList.getTotal(), list);
    }

    /**
     * 添加
     */
    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void save(Emp emp) {
        try {
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            empMapper.insert(emp);

            //事务只有在运行时异常是会发生回滚，编译时异常不会回滚
            //若需要所有的异常都回滚，需要来配置@Transactional注解当中的rollbackFor属性
            //@Transactional(rollbackFor = Exception.class)编译时异常也会回滚


            //@Transactional注解的后面指定一个属性propagation，通过 propagation 属性来指定传播行为。

            //int i = 1 / 0;
            ////模拟：异常发生
            //if(true){
            //    throw new Exception("出现异常了~~~");
            //}
            //service中向上抛出一个Exception编译时异常之后，由于是controller调用service，所以在controller中要有异常处理代码，此时我们选择在controller中继续把异常向上抛。

            //3. 保存员工的工作经历信息 - 批量
            Integer empId = emp.getId();
            List<EmpExpr> exprList = emp.getExprList();
            if (!CollectionUtils.isEmpty(exprList)) {
                exprList.forEach(empExpr -> empExpr.setEmpId(empId));
                empExprMapper.insertBatch(exprList);
            }
            //if (exprList != null) {
            //    exprList.forEach(empExpr -> empExpr.setEmpId(empId));
            //    empExprMapper.insertBatch(exprList);
            //}
        } finally {
            //记录操作日志
            EmpLog empLog = new EmpLog(null, LocalDateTime.now(), emp.toString());
            empLogService.insertLog(empLog);
        }
    }

    @Override
    public List<Emp> findAll(Emp emp) {
        return empMapper.findAll(emp);
    }

    /**
     * 删除
     */
    @Override
    public void del(List<Integer> ids) {
        empMapper.del(ids);
        empExprMapper.del(ids);
    }

    /*
     * 根据Id查询
     * */
    @Override
    public Emp getInfo(Integer id) {
        return empMapper.getInfo(id);
    }

    /**
     * 修改
     */
    @Override
    public void modify(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);

        //删除老的员工工作经历
        List<Integer> list = Arrays.asList(emp.getId());
        empExprMapper.del(list);


        //重新批量添加经历
        Integer empId = emp.getId();
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            exprList.forEach(empExpr -> empExpr.setEmpId(empId));
            empExprMapper.insertBatch(exprList);
        }

    }

    /**
     * 登录
     */
    @Override
    public LoginInfo login(Emp emp) {
        Emp empLogin = empMapper.login(emp);
        if (empLogin != null) {
            //生成载荷
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", empLogin.getId());
            claims.put("username", empLogin.getUsername());
            //生成令牌
            String jwt = JwtUtils.generateJwt(claims);
            //返回
            return new LoginInfo(empLogin.getId(), empLogin.getUsername(), empLogin.getName(), jwt);
        }
        return null;
    }


    //非PageHelper的分页代码
    //public PageResult page(EmpQueryParam empQueryParam) {
    //    //1、查询总数量
    //    Long total = empMapper.count();
    //
    //    //2、计算查询的起始索引
    //    Integer start = (empQueryParam.getPage()-1)*empQueryParam.getPageSize();
    //
    //    //3、执行查询
    //    List<Emp> list = empMapper.list(empQueryParam);
    //
    //    //4、封装PageResult对象
    //    return new PageResult(total,list);
    //}
}
